package guhong.play.commandsystem.job.tool.ai;

import cn.hutool.core.util.StrUtil;
import guhong.play.commandsystem.constant.Constant;
import guhong.play.commandsystem.job.tool.ai.service.AiService;
import guhong.play.commandsystem.job.tool.ai.service.QwenAiService;
import guhong.play.commandsystem.util.file.FileOperationUtil;
import guhong.play.commandsystem.util.print.PrintUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author : 李双凯
 * @date : 2019-11-20 22:32
 **/
public class AiCommandManager {

    private AiCommandManager() {
    }


    private static final AiService aiService = new QwenAiService();

    // 维护一个messageList
    private static final List<String> messageList = new ArrayList<>();

    // 维护一个标识，表示是否停止输出ai的回答
    public static AtomicBoolean stopOutput = new AtomicBoolean(false);

    // 配置文件地址
    public final static String CONFIG_FILE_PATH = Constant.CONFIG_PATH + "/ai/ai-config.json";

    public static AiConfig aiConfig = null;

    public static void init() {
        if (AiCommandManager.aiConfig == null) {
            AiCommandManager.aiConfig = FileOperationUtil.readAndParseObject(CONFIG_FILE_PATH, AiConfig.class);
            if (aiConfig == null) {
                aiConfig = AiConfig.buildDefaultConfig();
            }
        }
    }

    public static void getAnswer(String question) {
        aiService.getAnswer(question);
    }

    public static void appendMessage(String messageStr) {
        if (StrUtil.isBlank(messageStr)) {
            return;
        }
        messageList.add(messageStr);
    }

    public static void openNewSession() {
        messageList.clear();
    }

    @SuppressWarnings("all")
    public static List<String> getMessageList() {
        return messageList;
    }


    public static AiConfig.AiPrompt getPrompt(String promptName) {
        if (StrUtil.isBlank(promptName)) {
            return null;
        }
        // 使用stream流的方式，根据promptName获取prompt
        return aiConfig.getPromptList().stream().filter(aiPrompt -> aiPrompt.getName().equals(promptName)).findFirst().orElse(null);
    }

    public static void changePrompt(String promptName) {
        if (StrUtil.isBlank(promptName)) {
            // 如果promptName为空，则打印当前的prompt
            AiConfig.AiPrompt currentPrompt = aiConfig.getCurrentPrompt();
            PrintUtil.println(currentPrompt == null ? "当前没有Prompt" : "当前Prompt为：" + currentPrompt.getName());
            return;
        }
        AiConfig.AiPrompt aiPrompt = AiCommandManager.getPrompt(promptName);
        if (aiPrompt == null) {
            PrintUtil.printLnError("没有找到这个Prompt");
            return;
        }
        aiConfig.setCurrentPrompt(aiPrompt);
        // 打印提示
        PrintUtil.println("切换成功，当前为：" + aiPrompt.getName());
    }

    public static void saveAndChangePrompt(String scpCommand) {
        // 根据:拆分命令，得到promptName和prompt
        String[] split = scpCommand.split(":");
        if (split.length != 2) {
            PrintUtil.printLnError("Prompt格式错误");
            return;
        }
        if (StrUtil.isBlank(split[0]) || StrUtil.isBlank(split[1])) {
            PrintUtil.printLnError("Prompt格式错误");
            return;
        }
        if (aiConfig.getPromptList().stream().anyMatch(aiPrompt -> aiPrompt.getName().equals(split[0]))) {
            PrintUtil.printLnError("这个Prompt已经存在");
            return;
        }
        AiConfig.AiPrompt aiPrompt = new AiConfig.AiPrompt(split[0], split[1]);
        aiConfig.getPromptList().add(aiPrompt);

        // 切换prompt
        aiConfig.setCurrentPrompt(aiPrompt);

        // 打印提示
        PrintUtil.println("保存成功");
    }

    public static void removePrompt(String promptName) {
        // 删除指定的prompt，删除完成后打印提示
        aiConfig.getPromptList().removeIf(aiPrompt -> aiPrompt.getName().equals(promptName));
        PrintUtil.println("删除成功");
    }

    public static void printPromptList() {
        // 打印当前的prompt列表，如果没有输出提示
        if (aiConfig.getPromptList().isEmpty()) {
            PrintUtil.printLnError("没有Prompt");
            return;
        }
        // 优化打印的样式，每行都有分隔
        PrintUtil.println("当前Prompt列表：\n");
        aiConfig.getPromptList().forEach(aiPrompt -> {
            PrintUtil.println("["+aiPrompt.getName() + "]: " + aiPrompt.getPrompt());
            PrintUtil.println();
        });
    }

    public static void exitPrompt() {
        aiConfig.setCurrentPrompt(null);
        PrintUtil.println("退出成功");
    }

    public static void sync() {
        if (aiConfig != null) {
            aiConfig.sync();
        }
    }
}
